IF EXISTS (SELECT * FROM SYSOBJECTS WHERE name='spSeguridadUsuario' and XTYPE='P')
BEGIN
	DROP PROCEDURE [dbo].[spSeguridadUsuario]
END
GO
CREATE PROCEDURE [dbo].[spSeguridadUsuario]
	 @OP VARCHAR(64)=NULL
	,@ParamAuxiliar NVARCHAR(MAX)=NULL
	,@Id INT=NULL
	,@CodRol VARCHAR(16)=NULL
	,@CodUsuario VARCHAR(16)=NULL
	,@Login VARCHAR(32)=NULL
	,@UserName VARCHAR(64)=NULL
	,@Password VARCHAR(MAX)=NULL
	,@Activo BIT=NULL
WITH ENCRYPTION
AS
SET NOCOUNT ON;
BEGIN TRY

--/**** VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/
-------EXEC SP_ExecuteSQL N'dbo.spSeguridadUsuario @OP=''VerificarSessionActiva'''
--/**** FIN - VERIFICAR SI LA SESSION DE USUARIO ESTA ACTIVA ****/--DECLARE @ERROR VARCHAR(500)

DECLARE @AUX VARCHAR(512);
DECLARE @ERROR INT

/*****     OPERACION POR DEFECTO    *****/
IF @OP IS NULL OR @OP = ''
BEGIN
	SELECT
		 t.Id
		,t.CodRol
		,t.CodUsuario
		,t.[Login]
		,t.UserName
		,t.[Password]
		,t.Activo
	FROM
		[dbo].[SeguridadUsuario] t
	RETURN 0
END

/*****  SELECCIONAR POR LOGIN  *****/
IF @OP = 'SelectByLogin'
BEGIN
	SELECT
		 t.Id
		,t.CodRol
		,t.CodUsuario
		,t.[Login]
		,t.UserName
		,t.[Password]
		,t.Activo
	FROM
		[dbo].[SeguridadUsuario] t
	WHERE
		t.[Login]=@Login	
	RETURN 0
END

/*****     Verificar si la session sigue activa  *****/
IF @OP = 'VerificarSessionActiva'
BEGIN
	IF dbo.fnGetUsuarioSession() IS NULL
	BEGIN
		RAISERROR('Este error debe ocacionar que se solicite iniciar session al usuario...',16,1)
		RETURN 1
	END
	--- Actualizo la fecha del ultimo acceso
	UPDATE SeguridadDatosSession SET FechaInicio=GETDATE() WHERE Host=HOST_NAME()
	
	RETURN 0	
END


/*****     LOGIN   *****/
IF @OP = 'Login'
BEGIN
	
	--- Valido que coincidan el usuario y la clave
	IF NOT EXISTS (SELECT * FROM [dbo].[SeguridadUsuario] t WHERE t.[Login]=@Login  AND t.[Password] = @Password)
	BEGIN
		SET @AUX='Usuario No Registrado'
		RAISERROR(@AUX,16,1)
		RETURN 1
	END
	
	--- Verifico que el usuario Este activo
	IF NOT EXISTS (SELECT * FROM [dbo].[SeguridadUsuario] t WHERE t.[Login]=@Login and  t.[Activo]=1)
	BEGIN
		SELECT @AUX='El Usuario "'+t.UserName+'" No se encuentra activo, comuniquese con el administrador del sistema.' FROM [dbo].[SeguridadUsuario] t WHERE t.[Login]=@Login
		RAISERROR(@AUX,16,1)
		RETURN 1
	END
	
	--- Verifico que el Rol del usuario Este activo
	IF NOT EXISTS (SELECT * FROM [dbo].[SeguridadUsuario] t INNER JOIN SeguridadRol r  ON t.CodRol=r.CodRol WHERE t.[Login]=@Login and  r.[Activo]=1)
	BEGIN
		SELECT @AUX='El ROL de usuario "'+r.NombreRol+'" No se encuentra activo, comuniquese con el administrador del sistema.' FROM [dbo].[SeguridadUsuario] t INNER JOIN SeguridadRol r   ON t.CodRol=r.CodRol WHERE t.[Login]=@Login
		RAISERROR(@AUX,16,1)
		RETURN 1
	END
	
	--- Si hay datos de session asociados al actual Host o al usuario los elimino
	DELETE FROM [dbo].[SeguridadDatosSession] WHERE Host=HOST_NAME() OR Usuario=@Login
	--- Grabo los datos de sesion en la tabla [SeguridadDatosSession] para que puedan ser accedidos desde cualquier Sp que se ejecute.
	INSERT INTO [dbo].[SeguridadDatosSession] (Host,Usuario) VALUES (HOST_NAME(),@Login)		
	--- Grabo la accion en el log
	SELECT @AUX='LOGIN: '+t.[Login]+', CODIGO USUARIO: '+CONVERT(VARCHAR(16),t.CodUsuario) FROM [dbo].[SeguridadUsuario] t WHERE t.[Login]=@Login
	EXEC dbo.spSeguridadLogEventos_Insert @Evento='INICIO DE SESION',@Detalle=@AUX
	
	--- Retorno los datos del usuario	
	SELECT
		 t.Id
		,t.CodRol
		,t.CodUsuario
		,t.[Login]
		,t.UserName
		,t.[Password]
		,t.Activo
	FROM
		[dbo].[SeguridadUsuario] t
	WHERE
		t.[Login]=@Login 
		AND t.[Password] = @Password
		AND t.[Activo]=1
	RETURN 0
END

--- Si se llega a este punto es porque el @OP indicado no Existe en el Procedimiento Almacenado
IF @OP IS NOT NULL
	BEGIN
	SET @ParamAuxiliar='La Operacion "'+@OP+'" No esta definida en el Procedimiento almacenado "'+OBJECT_NAME(@@PROCID)+'", Revise!.'
	RAISERROR(@ParamAuxiliar,16,1)
	RETURN 1
END
	
--- CONTROLAR Y REGISTRAR LOS ERRORES
END TRY
BEGIN CATCH
	--- Recopilo la informacion del error
	DECLARE @ERROR_NUMBER INT=ERROR_NUMBER(),@ERROR_SEVERITY INT=ERROR_SEVERITY(),@ERROR_STATE INT=ERROR_STATE(),@ERROR_PROCEDURE VARCHAR(128)=ERROR_PROCEDURE(),@ERROR_LINE INT=ERROR_LINE(),@ERROR_MESSAGE VARCHAR(2048)=ERROR_MESSAGE()
	--- Si hay transacciones abiertas, hago un rollback, SE ENCIERRA EN UN (TRY-CATCH) PARA QUE NO SE MUESTRE EL ERROR: Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT
	IF(@@TRANCOUNT>0) BEGIN BEGIN TRY ROLLBACK TRANSACTION END TRY BEGIN CATCH END CATCH END
	--- Ejecuto el SP que controla y registra el error
	EXEC [spSeguridadMessageException] @OP='MostrarMensaje',@ParamAuxiliar=@OP,@ERROR_NUMBER=@ERROR_NUMBER,@ERROR_SEVERITY=@ERROR_SEVERITY,@ERROR_STATE=@ERROR_STATE,@ERROR_PROCEDURE=@ERROR_PROCEDURE,@ERROR_LINE=@ERROR_LINE,@ERROR_MESSAGE=@ERROR_MESSAGE
	RETURN 1
END CATCH;

